10 *=49152 11 ! 12 ! DISABLE INTERUPTS,SET UP 13 ! INTERUPT VECTOR,ENABLE RASTER 14 ! INTERUPT,SET UP VIC BANKS, 15 ! DISABLE HARDWARE TIMER A, 16 ! RE-ENABLE INTERUPTS. 17 ! 20 SETINT SEI 30 LDA #INTR 60 STA 789 70 LDA 53274 80 ORA #1 90 STA 53274 100 LDA 53265 110 AND #127 120 STA 53265 130 LDA #252 140 STA 53266 150 LDA 56578 160 ORA #3 170 STA 56578 180 LDA 56576 190 AND #252 200 ORA #2 210 STA 56576 220 LDA 56334 230 AND #254 240 STA 56334 250 CLI 251 ! 252 ! SET SCREEN COLOURS, 253 ! SET START VALUES TO BE 254 ! STORED IN MAP & MAP+1 255 ! (SEE WINDOW) 256 ! 260 LDA #0 270 STA 53280 280 STA 53281 290 LDA #<32768 300 STA MAP 310 LDA #>32768 320 STA MAP+1 997 ! 998 RTS 1000 ! 1001 ! CHECK TO SEE IF A SCROLL 1002 ! IS TAKING PLACE.IF NOT JUMP 1003 ! TO 'NOSCROLL' OTHERWISE 1004 ! CHECK TO SEE WHICH OF THE 8 1005 ! POSSIBLE DIRECTIONS WE ARE 1006 ! SCROLLING IN AND PROCESS. 1007 ! 1020 INTR LDA WAY 1030 BEQ NOSCROLL 1040 CMP #1 1050 BNE W1 1060 JSR YSUB 1070 JMP NOSCROLL 1080 W1 CMP #2 1090 BNE W2 1100 JSR YADD 1110 JMP NOSCROLL 1120 W2 CMP #3 1130 BNE W3 1140 JSR XSUB 1150 JMP NOSCROLL 1160 W3 CMP #4 1170 BNE W4 1179 JSR XADD 1180 JMP NOSCROLL 1181 W4 CMP #5 1182 BNE W5 1183 JSR XADD 1184 JSR YSUB 1185 JMP NOSCROLL 1186 W5 CMP #6 1187 BNE W6 1188 JSR YSUB 1189 JSR XSUB 1190 JMP NOSCROLL 1191 W6 CMP #7 1192 BNE W7 1193 JSR YADD 1194 JSR XADD 1195 JMP NOSCROLL 1196 W7 CMP #8 1197 BNE NOSCROLL 1198 JSR YADD 1199 JSR XSUB 1200 ! 1210 ! SET UP LOCATION OF RASTER 1211 ! SPLIT AND RE-VECTOR THE 1212 ! INTERUPT TO PROCESS THE 1213 ! STATUS LINE (NON MOVING 1214 ! SCREEN) ROUTINE. 1215 ! 1240 NOSCROLL LDA #STATLINE 1270 STA 789 1280 LDA RASTER 1290 STA 53266 1300 JMP EXINT 1301 ! 1302 ! SET 40 COLUMN SCREEN, 1303 ! CLEAR SCROLL REGISTERS TO 1304 ! ENSURE THIS SECTION OF THE 1305 ! SCREEN IS STILL,RE-VECTOR 1306 ! THE INTERUPT TO PROCESS THE 1307 ! ROUTINE DEALING WITH THE 1308 ! SCROLLING SECTION OF THE 1309 ! SCREEN,JSR TO 'CONTROL' ROUTINE 1310 ! 1315 STATLINE LDA #8 1320 STA 53270 1330 LDA #23 1340 STA 53265 1350 LDA #54 1360 STA 53272 1370 LDA #GAMEAREA 1400 STA 789 1405 LDA #7 1406 STA 53280 1410 JSR CONTROL 1415 LDA #0 1416 STA 53280 1420 LDA #252 1430 STA 53266 1440 JMP EXINT 1441 ! 1442 ! SET 38 COLUMN,24 ROW SCREEN 1443 ! PRINT UP SCREEN FROM 1444 ! MAP & MAP+1,SET VALUES OF 1445 ! SCROLL REGISTERS. 1446 ! 1450 GAMEAREA LDA 53270 1455 AND #0 1456 ORA #16 1470 ORA XSCROLL 1480 STA 53270 1490 LDA 53265 1500 AND #248 1510 ORA YSCROLL 1520 STA 53265 1610 LDA #36 1620 STA 53272 1625 LDA #6 1626 STA 53280 1650 JSR WINDOW 1651 LDA #0 1652 STA 53280 1654 JMP INTR 1655 ! 1656 ! SIGNAL THAT INTERUPT HAS BEEN 1657 ! PROCESSED,RESTORE REGISTERS 1658 ! AND RETURN FROM INTERUPT. 1659 ! 1660 EXINT LDA #1 1670 STA $D019 1690 PLA 1700 TAY 1710 PLA 1720 TAX 1730 PLA 1740 RTI 1741 ! 1742 ! HARDWARE SCROLL SCREEN 1 PIXEL 1743 ! TO THE RIGHT.IF SCREEN HAS 1744 ! MOVED MORE THAN 1 CHAR. THEN 1745 ! SUBTRACT 1 FROM 16 BIT VALUE IN 1746 ! MAP & MAP+1. 1747 ! 1750 XADD LDA 53270 1760 ORA #248 1770 CLC 1780 ADC XSPEED 1790 AND #7 1800 STA XSCROLL 1810 BCC EXXADD 1820 SEC 1830 LDA MAP 1840 SBC #1 1850 STA MAP 1860 LDA MAP+1 1870 SBC #0 1880 STA MAP+1 1960 EXXADD RTS 1961 ! 1962 ! HARDWARE SCROLL SCREEN 1 PIXEL 1963 ! TO THE LEFT.IF SCREEN HAS 1964 ! MOVED MORE THAN 1 CHAR. THEN 1965 ! ADD 1 TO 16 BIT VALUE 1966 ! IN MAP & MAP+1. 1967 ! 1970 XSUB LDA 53270 1980 AND #7 1990 SEC 2000 SBC XSPEED 2010 AND #7 2020 STA XSCROLL 2030 BCS EXXSUB 2040 CLC 2050 LDA MAP 2060 ADC #1 2070 STA MAP 2080 LDA MAP+1 2090 ADC #0 2100 STA MAP+1 2180 EXXSUB RTS 2181 ! 2182 ! HARDWARE SCROLL THE SCREEN 2183 ! DOWN 1 PIXEL. IF SCREEN HAS 2184 ! MOVED MORE THAN 1 CHAR THEN 2185 ! SUBTRACT NUMBER OF SCREENS 2186 ! HORIZONTALLY IN MAP MULTIPLYED 2187 ! BY 40 FROM 16 BIT VALUE IN 2188 ! MAP & MAP+1. 2189 ! EG:- 2190 ! IF THERE ARE 6 SCREEN ACROSS 2191 ! IN MAP THEN SUBTRACT 240. 2192 ! 2199 YADD LDA 53265 2200 ORA #248 2210 CLC 2220 ADC YSPEED 2230 AND #7 2240 STA YSCROLL 2250 BCC EXYADD 2260 SEC 2270 LDA MAP 2280 SBC #240 2290 STA MAP 2300 LDA MAP+1 2310 SBC #0 2320 STA MAP+1 2400 EXYADD RTS 2401 ! 2402 ! AS ABOVE BUT SCROLL UP 1 PIXEL 2403 ! AND ADD SAME VALUE IF 2404 ! NECESSARY. 2405 ! 2410 YSUB LDA 53265 2420 AND #7 2430 SEC 2440 SBC YSPEED 2450 AND #7 2460 STA YSCROLL 2470 BCS EXYSUB 2480 CLC 2490 LDA MAP 2500 ADC #240 2510 STA MAP 2520 LDA MAP+1 2530 ADC #0 2540 STA MAP+1 2620 EXYSUB RTS 4000 ! 4001 ! (SEE DIAGRAM 1 ):- 4002 ! PRINT UP 1000 BYTES TO SCREEN, 4003 ! ( SCREEN IS AT 17408), 4004 ! STARTING AT MEMORY LOCATION 4005 ! POINTED AT BY VALUES IN 4006 ! MAP & MAP+1. 4007 ! 4070 WINDOW LDA #<18432 4080 STA 253 4090 LDA #>18432 4100 STA 254 4120 LDA MAP 4130 STA 251 4140 LDA MAP+1 4150 STA 252 4160 LDX #18 4180 WINDLOOP1 LDY #0 4190 WINDLOOP2 LDA (251),Y 4200 STA (253),Y 4210 INY 4215 CPY #40 4220 BNE WINDLOOP2 4230 LDA 251 4240 CLC 4250 ADC #240 4260 STA 251 4270 BCC WINDLP2 4290 INC 252 4300 WINDLP2 LDA 253 4310 CLC 4320 ADC #40 4330 STA 253 4340 BCC EXCAL 4360 INC 254 4370 EXCAL DEX 4376 BNE WINDLOOP1 4390 RTS 4400 ! 4410 ! VARIABLES AS FOLLOWS :- 4411 ! 4412 ! 1 - LO,HI ADDRESS OF SCREEN 4413 ! (ROW 0,COLUMN 0) IN OVERALL MAP 4414 ! 2 - POSISTION OF RASTER SPLIT 4415 ! 3 - SPEED OF X SCROLL 4416 ! 4 - SPEED OF Y SCROLL 4417 ! 5 - VALUE OF X SCROLL REGISTER 4418 ! 6 - VALUE OF Y SCROLL REGISTER 4419 ! 7 - JOYSTICK X VALUE 4420 ! 8 - JOYSTICK Y VALUE 4421 ! 9 - DIRECTION OF SCROLL (0-8) 4422 ! 6000 MAP BYT <32768,>32768 6030 RASTER BYT 189 6060 XSPEED BYT 1 6070 YSPEED BYT 1 6080 XSCROLL BYT 0 6090 YSCROLL BYT 0 6100 DX BYT 0 6110 DY BYT 0 6160 WAY BYT 0 6161 ! 6162 ! THE VALUES IN WAY INDICATE 6163 ! THE FOLLWING:- 6164 ! 6165 ! 0 = NO SCROLLING 6166 ! 1 = SCROLL UP 6167 ! 2 = SCROLL DOWN 6168 ! 3 = SCROLL LEFT 6169 ! 4 = SCROLL RIGHT 6170 ! 5 = SCROLL UP & RIGHT 6171 ! 6 = SCROLL UP & LEFT 6172 ! 7 = SCROLL DOWN & RIGHT 6173 ! 8 = SCROLL DOWN & LEFT 6174 ! 6179 ! 6180 ! JOYSTICK READING ROUTINE. 6181 ! SEE PAGE 345 OF PROGRAMMERS 6182 ! REFERENCE GUIDE FOR FULL 6183 ! EXPLANATION. 6184 ! 7000 JOYREAD LDA 56320 7010 LDY #0 7020 LDX #0 7025 ! 7030 LSR A 7040 BCS JOY0 7050 DEY 7060 JOY0 LSR A 7070 BCS JOY1 7080 INY 7090 JOY1 LSR A 7100 BCS JOY2 7110 DEX 7120 JOY2 LSR A 7130 BCS JOY3 7140 INX 7150 JOY3 LSR A 7160 STX DX 7170 STY DY 7180 RTS 7190 ! 7191 ! MAIN CONTROL ROUTINE :- 7192 ! DECIDE WHICH DIRECTION TO 7193 ! SCROLL. 7194 ! 8000 CONTROL JSR JOYREAD 8010 LDX DX 8020 LDY DY 8021 TXA 8022 BNE VERTICAL 8023 TYA 8024 BNE VERTICAL 8025 STA WAY 8026 RTS 8030 VERTICAL CPX #0 8040 BNE HORIZONTAL 8050 UPC CPY #255 8060 BNE DOWNC 8070 LDA #2 8080 STA WAY 8090 RTS 8100 DOWNC CPY #1 8110 BNE XVERT 8120 LDA #1 8130 STA WAY 8140 XVERT RTS 8150 HORIZONTAL CPY #0 8160 BNE DIA(null)NAL 8170 LEFTC CPX #255 8180 BNE RIGHTC 8190 LDA #4 8200 STA WAY 8210 RTS 8220 RIGHTC CPX #1 8230 BNE OUTCON 8240 LDA #3 8250 STA WAY 8260 OUTCON RTS 8270 DIA(null)NAL CPY #255 8280 BNE DIAGDOWN 8290 CPX #1 8300 BNE UPLFT 8310 UPRGHT LDA #8 8320 STA WAY 8330 RTS 8340 UPLFT CPX #255 8350 BNE OUTCON 8360 LDA #7 8370 STA WAY 8380 RTS 8390 DIAGDOWN CPY #1 8400 BNE XDIAG 8410 CPX #1 8420 BNE DWNLFT 8440 DWNRGHT LDA #6 8450 STA WAY 8460 RTS 8470 DWNLFT CPX #255 8480 BNE XDIAG 8490 LDA #5 8500 STA WAY 8510 XDIAG RTS 8520 ! 8530 END